package com.waterstudio.filedownloader.ext.m3u8;

import com.liulishuo.filedownloader.BaseDownloadTask;
import com.liulishuo.filedownloader.M3u8DownloadListenerWrapper;

/**
 * https://raw.githubusercontent.com/lingochamp/FileDownloader/master/art/filedownloadlistener_callback_flow.png
 * <p>
 * Created by chensuilun on 2019/3/15.
 */
public interface M3u8DownloadCallback {


    /**
     * 和 {@link M3u8DownloadCallback#onInterceptBlockCompleteM3u8(BaseDownloadTask, M3u8DownloadListenerWrapper)} 都可能是 M3U8 下载的入口，见
     * https://raw.githubusercontent.com/lingochamp/FileDownloader/master/art/filedownloadlistener_callback_flow.png
     *
     * @param baseDownloadTask
     * @param listenerWrapper
     * @return 是否继续下载，false：正在下载或者已经下载完成了，结束该任务，后续回调 complete 或者 warn
     */
    boolean onPendingDownloadM3u8(BaseDownloadTask baseDownloadTask, M3u8DownloadListenerWrapper listenerWrapper);

    /**
     * m3u8 文件准备完毕(非主线程回调)
     * 和 {@link M3u8DownloadCallback#onPendingDownloadM3u8(BaseDownloadTask, M3u8DownloadListenerWrapper)} 都可能是 M3U8 下载的入口，见
     * https://raw.githubusercontent.com/lingochamp/FileDownloader/master/art/filedownloadlistener_callback_flow.png
     *
     * @param baseDownloadTask
     * @return 是否拦截 M3u8 的回调，false：正在下载或者已经下载完成了，结束该任务，后续回调 complete 或者 warn
     */
    boolean onInterceptBlockCompleteM3u8(BaseDownloadTask baseDownloadTask, M3u8DownloadListenerWrapper listenerWrapper) throws Exception;

    /**
     * m3u8 文件下载完成
     *
     * @param baseDownloadTask
     * @return 是否拦截 M3u8 的回调，false：任务已经下载完成了（目标文件已经存在）
     */
    boolean onInterceptCompleteM3u8(BaseDownloadTask baseDownloadTask);

    /**
     * 开始下载 TS 文件
     *
     * @param baseDownloadTask
     * @param listenerWrapper
     */
    void onStartTsDownload(BaseDownloadTask baseDownloadTask, M3u8DownloadListenerWrapper listenerWrapper);

    /**
     * TS 文件下载进度更新
     *
     * @param parentTask
     * @param tsTask
     * @param soFarBytes
     * @param totalBytes
     * @return
     */
    float onUpdateProgress(BaseDownloadTask parentTask, BaseDownloadTask tsTask, long soFarBytes, long totalBytes);

    /**
     * ts 下载暂停
     *
     * @param parentTask
     * @param tsTask
     */
    void onTsDownloadPaused(BaseDownloadTask parentTask, BaseDownloadTask tsTask);

    /**
     * ts 下载失败
     *
     * @param parentTask
     * @param tsTask
     */
    void onTsDownloadError(BaseDownloadTask parentTask, BaseDownloadTask tsTask);


    /**
     * Ts 文件下载准备完毕(非主线程回调)
     *
     * @param parentTask
     * @param tsTask
     * @return 是否下载完成
     * @throws Exception
     */
    boolean onBlockCompleteTs(BaseDownloadTask parentTask, BaseDownloadTask tsTask) throws Exception;


    /**
     * Ts 文件下载完毕
     *
     * @param parentTask
     * @param tsTask
     * @return Ts 文件是否下载完成
     */
    boolean onCompleteTs(BaseDownloadTask parentTask, BaseDownloadTask tsTask);

}
